package com.lw.conexecutor.customPool;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author LW
 * @2020/8/18 23:30
 */
//测试线程池
public class TestPool {

    public static void main(String[] args) {
        /**排队策略：
         * 直接提交SynchronousQueue：
         * 如果不存在可用于立即运行任务的线程（即线程池中的线程都在工作），
         * 则试图把任务加入缓冲队列将会失败，因此会**构造一个新的线程来处理新添加的任务，并将其加入到线程池**中。
         *
         * 无界队列LinkedBlockingQueue：
         * 理论上是该缓冲队列可以对无限多的任务排队
         * 当每个任务完全独立于其他任务，即任务执行互不影响时，适合于使用无界队列。
         *
         * 有界队列ArrayBlockingQueue：
         * newFixedThreadPool采用的排队策略
         * 有助于防止资源耗尽，但是可能较难调整和控制，队列大小和最大池大小需要相互折衷，需要设定合理的参数。
         *
         * 延迟队列DelayQueue：
         * ScheduledTreadPoolExecutor采用的排队策略
         */

        //创建线程池，大小为10
        ExecutorService service = Executors.newFixedThreadPool(10);
        //执行    线程池的大小在同时创建的线程
        service.execute(new MyThread1());
        service.execute(new MyThread1());
        service.execute(new MyThread1());//submit方法有返回值，一般用来执行callable有返回值,
        service.execute(new MyThread1());//execute是没有返回值的，一般用来执行Runnable
        service.execute(new MyThread1());
        service.execute(new MyThread1());
        service.execute(new MyThread1());
        service.execute(new MyThread1());
        service.execute(new MyThread1());
        service.execute(new MyThread1());
        //关闭连接
        service.shutdown();
    }
}

class MyThread1 implements Runnable{

    @Override
    public void run() {
            System.out.println(Thread.currentThread().getName());
    }
}